package me.android.library.utils.android.wifi;

import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSuggestion;
import android.os.Build;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

import com.google.common.collect.Lists;

import java.util.List;

import me.android.library.utils.android.SystemServiceUtil;
import me.android.library.utils.android.ToastUtil;

@RequiresApi(api = Build.VERSION_CODES.R)
public interface WifiConnector {

    default WifiManager getWifiManager() {
        return SystemServiceUtil.getWifiManager();
    }

    default WifiNetworkSuggestion buildSuggestion(@NonNull String ssid, @NonNull String password, WifiCipherType cipherType) {
        WifiNetworkSuggestion.Builder builder = new WifiNetworkSuggestion.Builder().setSsid(ssid);
        switch (cipherType) {
            case WPA_PSK -> builder.setWapiPassphrase(password);
            case WPA2_PSK -> builder.setWpa2Passphrase(password);
            case WPA3_SAE -> builder.setWpa3Passphrase(password);
        }

        return builder.build();
    }

    /**
     * 连接到指定 Wi-Fi（Android 12+ 版本）
     */
    default void connectToWifi(@NonNull String ssid, @NonNull String password, WifiCipherType cipherType) {
        // 1. 构建 Wi-Fi 网络建议
        WifiNetworkSuggestion suggestion = buildSuggestion(ssid, password, cipherType);

        // 2. 添加网络建议到系统
        List<WifiNetworkSuggestion> suggestions = Lists.newArrayList();
        suggestions.add(suggestion);

        int status = getWifiManager().addNetworkSuggestions(suggestions);
        if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
            // 3. 建议添加成功，系统会自动显示网络选择对话框
            // 用户选择并连接后，应用可通过监听网络变化来确认连接状态
            ToastUtil.showShort("添加wifi成功");
        } else {
            // 处理失败情况（如建议已存在、权限不足等）
            handleFailure(status);
        }
    }

    /**
     * 移除网络建议（不再需要连接时调用）
     */
    default void removeNetworkSuggestions() {
        getWifiManager().removeNetworkSuggestions(null); // 传入 null 移除所有建议
    }

    /**
     * 处理添加网络建议失败的情况
     */
    private void handleFailure(int status) {
        switch (status) {
            case WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE:
                // 建议已存在
                break;
            case WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP:
                // 超过最大建议数
                break;
            case WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID:
                // 建议无效（如格式错误）
                break;
            case WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED:
                // 没有权限添加建议
                break;
            default:
                // 其他错误
                break;
        }

        ToastUtil.showShort("添加wifi失败,状态码:" + status);
    }
}
